//首先能够证明长度越长的时候，其最后一个数也同时越大
//所以长度相同的时候，需要保存最大值最小的数
#include <iostream>
using namespace std;

const int N = 1e5 + 10;
int n;
int dp[N], a[N], q[N];
//q[N]存储的是每种长度最大元素的最小值
int main()
{
    cin >> n;
    for(int i = 1; i <= n; ++i)
        cin >> a[i];
    int len = 0;
    for(int i = 1; i <= n; ++i)
    {
        int l = 0, r = len;
        while(l < r)
        {
            int mid = l + r + 1 >> 1;
            if(q[mid] < a[i]) l = mid;
            else r = mid - 1;
        }
        q[r + 1] = a[i];
        len = max(len, r + 1);
    }
    cout << len << endl;
    return 0;
}
